import java.util.ArrayList;

/*******************************************
 * Completez le programme a partir d'ici.
 *******************************************/
class Piece{
	private String nom;
	
	public Piece(String nom){
		this.nom = nom;
	}
	
	public String getNom(){
		return nom;
	}
	
	@Override public String toString(){
		return String.format(getNom());
	}
}

class Simple extends Piece {
	private String orientation = "aucune";
	
	public Simple(String nom){
		super(nom);
	}
	
	public Simple(String nom, String orientation){
		super(nom);
		this.orientation = orientation;
	}
	
	public String getOrientation(){
		return orientation;
	}
	
	@Override public String toString(){
		String result = "";
		result += getNom() + " ";
		
		if((getOrientation())!= "aucune" && getOrientation()!= " "){
			result += getOrientation();
		}
		
		return result;
	}	
}

class Composant{
	private Piece piece;
	private int quantite;
	
	public Composant(Piece piece, int quantite){
		this.piece = piece;
		this.quantite = quantite;
	}
	
	public Piece getPiece(){
		return piece;
	}
	
	public int getQuantite(){
		return quantite;
	}
}

class Composee extends Piece{
	private ArrayList<Piece> pieces = new ArrayList<Piece>();
	private int nombreCourantDePieces;
	private int nombreMaximalDePieces;
	
	public Composee(String nom, int nombreMaximalDePieces) {
		super(nom);
		this.nombreMaximalDePieces = nombreMaximalDePieces;
	}
	
	public int taille(){
		return nombreCourantDePieces;
	}
	
	public int tailleMax(){
		return nombreMaximalDePieces;
	}
	
	public ArrayList<Piece> getPieces(){
		return pieces;
	}
	
	public void construire(Piece piece){
		if(nombreCourantDePieces < nombreMaximalDePieces){
			pieces.add(piece);
			nombreCourantDePieces++;
		}
		else{
			System.out.println("Construction impossible");
		}
	}
	
	@Override public String toString(){
		String result = String.format("%s (", getNom());
		int index = 0;
		int maxIndex = pieces.size();
		
		for(Piece piece: pieces){
			if(piece instanceof Composee){
				result += piece.getNom();
			}
			else{
				if(piece instanceof Simple){
					result += ((Simple)piece).toString();
				}
			}
			
			index++;
			if(index < maxIndex){
				result += ",";
			}
		}
		result += ") ";
		
		return result;
	}
}

class Construction{
	private int nombreMaximalDeComposant;
	private int nombreCourantDeComposant;
	private ArrayList<Composant> composants = new ArrayList<Composant>();
	
	public Construction(int nombreMaximalDeComposant){
		this.nombreMaximalDeComposant = nombreMaximalDeComposant;
	}
	
	public int taille(){
		return nombreCourantDeComposant;
	}
	
	public int tailleMax(){
		return nombreMaximalDeComposant;
	}
	
	public void ajouterComposant(Piece piece, int nombreDeComposants){
		if(nombreCourantDeComposant < nombreMaximalDeComposant){
			Composant composant = new Composant(piece, nombreDeComposants);
			composants.add(composant);
			nombreCourantDeComposant++;
		}
		else{
			System.out.println("Ajout de composant impossible");
		}
	}
	
	@Override public String toString(){
		String resultat = "";
		ArrayList<Piece> subpieces = new ArrayList<Piece>();
		
		for(Composant composant:composants){
			resultat += composant.getPiece().toString() + "(quantite " + composant.getQuantite() + ")" +"\n";

			
		}
		
		return resultat;
	}

}
/*******************************************
 * Ne pas modifier apres cette ligne
 * pour pr'eserver les fonctionnalit'es et
 * le jeu de test fourni.
 * Votre programme sera test'e avec d'autres
 * donn'ees.
 *******************************************/

class Lego {

    public static void main(String[] args) {
    	
        // declare un jeu de construction de 10 pieces
        Construction maison = new Construction(10);

        // ce jeu a pour premier composant: 59 briques standard
        // une brique standard a par defaut "aucune" comme orientation
        maison.ajouterComposant(new Simple("brique standard"), 59);

        // declare une piece dont le nom est "porte", composee de 2 autres pieces
        Composee porte = new Composee("porte", 2);

        // cette piece composee est constituee de deux pieces simples:
        // un cadran de porte orient'e a gauche
        // un battant orient'e a gauche
        porte.construire(new Simple("cadran porte", "gauche"));
        porte.construire(new Simple("battant", "gauche"));

        // le jeu a pour second composant: 1 porte
        maison.ajouterComposant(porte, 1);

        // déclare une piece composee de 3 autres pieces dont le nom est "fenetre"
        Composee fenetre = new Composee("fenetre", 3);
        
        // cette piece composee est constitu'ee des trois pieces simples:
        // un cadran de fenetre (aucune orientation)
        // un volet orient'e a gauche
        // un volet orient'e a droite
        fenetre.construire(new Simple("cadran fenetre"));
        fenetre.construire(new Simple("volet", "gauche"));
        fenetre.construire(new Simple("volet", "droit"));

        // le jeu a pour troisieme composant: 2 fenetres
        maison.ajouterComposant(fenetre, 2);

        // affiche tous les composants composants (nom de la piece et quantit'e)
        // pour les pieces compos'ees : affiche aussi chaque piece les constituant
        System.out.println("Affichage du jeu de construction : ");
        System.out.println(maison);
        
        
    }
}
